#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/10/5 16:49
# @Author : youngchaolin

# 1 用map来处理字符串列表，将列表中所有人都变成sb，比如alex_sb
name=['oldboy','alex','clyang','wysir']
ret=map(lambda str:str+'_sb',name)
print(ret)
print(list(ret))

# 2 用filter来处理，得到股票价格大于20的股票名字
shares={
    'IBM':36.6,
    'Apple':55.5,
    'lenovo':10,
    'oldboy':22,
    'boe':40
}

name=filter(lambda key:shares.get(key)>20,shares)
print(name)
print(list(name))

# 3 有下面的字典，得到购买每只股票的总价格，并放到一个迭代器中，list一下得到结果
portfolio=[
    {'name':'IBM','shares':100,'price':91.1},
    {'name':'Apple','shares':50,'price':543.22},
    {'name':'FB','shares':200,'price':21.09},
    {'name':'BOE','shares':50,'price':2.9},
    {'name':'oldboy','shares':100,'price':22},
]

ret=map(lambda dic:dic.get('shares')*dic.get('price'),portfolio)
print(list(ret))

# 4 有下列三种数据类型
l1=[1,2,3,4,5,6]
l2=['oldboy','alex','wusir','太白','messi']
tu=('**','***','****','*******')
# 写代码，最终得到的是[(3,'wusir','****'),(4,'太白','*******')]这样的数据，元祖的一个元素>2，第三个元素至少有4个*
ret=zip(l1,l2,tu)
print(ret)
ret1=filter(lambda tuple:tuple[0]>2 and len(tuple[2])>3,ret)
print(list(ret1))

# 5 将l1中列表中的每个字典的values大小进行排序，形成一个新的列表
sales=[
    {'sales_volumn':456},
    {'sales_volumn':123},
    {'sales_volumn':222},
    {'sales_volumn':1},
    {'sales_volumn':33},
    {'sales_volumn':55},
    {'sales_volumn':55},
    {'sales_volumn':22}
]
# 按照values大小升序排列
ret=sorted(sales,key=lambda dic:dic['sales_volumn'])
print(ret)
# 按照values大小降序排列
ret=sorted(sales,key=lambda dic:dic['sales_volumn'],reverse=True)
print(ret)

# 6 看代码求结果
v=(lambda :x for x in range(10)) # 代表没有参数
print(v) # 生成器
# print(v[0]) # 报错
# print(v[0]()) # 报错
print(next(v))
print(next(v)()) # 1，前面已经执行一次了

# 7 看代码求结果
v=[lambda :x for x in range(10)] # 代表没有参数
print(v) # 列表
print(v[0])
print(v[0]()) # 9
# print(next(v)) # 报错
# print(next(v)()) # 报错

# 8 map(str,[1,2,3,4,5,6,7,8,9])输出的是什么
print(map(str,[1,2,3,4,5,6,7,8,9]))
print(list(map(str,[1,2,3,4,5,6,7,8,9]))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

# 9 比较难的面试题
def num():
    return [lambda x:i*x for i in range(4)]
# 最后x都会变成3
print([m(2) for m in num()]) # [6, 6, 6, 6]

# TODO 10 有一个数组[34,1,2,5,6,5,4,3,3]，写一个函数，找出数组中没有重复的数，并且求和
# 如上面的数据没有重复的数就是1和2
li=[34,1,2,5,5,4,3,3]

def get_number(number):
    # 得到数据的长度
    length=len(str(number))
    # 循环取值，放入list
    li=[]
    for index in range(length):
        li.append(int(str(number)[index]))
    return li

# print(get_number(344))

result=[]
for item in li:
    l1=get_number(item)
    result+=l1

# 求出result中每个数字出现的次数
ret=map(lambda x:(x,1),result)
print(list(ret))

# TODO 写到这里卡住了

# 继续换种写法，写了两个函数
def get_number(number):
    # 得到数据的长度
    length=len(str(number))
    # 循环取值，放入list
    li=[]
    for index in range(length):
        li.append(int(str(number)[index]))
    return li


def get_onlyone_number_sum(li):
    dic={}
    for num in li:
        l1=get_number(num)
        for number in l1:
            dic[number]=dic.get(number,0)+1
    print(dic)
    # 查询map中value为1的key
    ret=filter(lambda key:dic.get(key)==1,dic)
    return sum(list(ret))

print(get_onlyone_number_sum(li)) # 3



# TODO 11 写一个函数完成三次登录功能
# 用户的用户名和密码从一个文件register中取出
# register文件包含多个用户名和密码，用户名密码通过|隔开，每个人的的用户名和密码占用文件的一行
# 完成三次验证，三次都不通过就验证失败了，返回False，否则返回True

def login():
    count=1
    while count<4:
        u=input("请输入用户名")
        p=input("请输入密码")
        # 读取文件，获取用户名和密码，保存到一个字典中
        with open('register.txt',mode='r',encoding='utf-8') as f:
            for line in f:
                # 读取文件后，密码会加一个\n换行符，需要使用strip去掉
                if u == line.split('|')[0].strip() and p == line.split('|')[1].strip():
                    print("登录成功")
                    return True
        # 能执行到这里，说明登录失败
        print('登录失败')
        # 提示剩余次数
        print("你还有%d次机会"%(3-count))
        # 次数
        count+=1
    else:
        print("没机会了老哥")
        return False

# 调用
print(login())
